<?php
		
	/* SVN FILE: $Id: table.php 24 2011-03-21 18:16:13Z michele.andreoletti@gmail.com $ */
	
	/**
	 * Project Name : arcadia
	 *
	 * @author $Author: michele.andreoletti@gmail.com $
	 * @version $Revision: 24 $
	 * @lastrevision $Date: 2011-03-21 18:16:13 +0000 (Mon, 21 Mar 2011) $
	 * @filesource $URL: http://arcadia.googlecode.com/svn/trunk/include/table.php $
	 */
	
	if (!isset($sAPP) || !is_string($sAPP) || !isset($aSUITE) || !is_array($aSUITE) || !isset($aSUITE[$sAPP])) {

	   	/**
		 * Intercetto la situazione in cui viene eseguito direttamente questo script (ovvero quando
		 * questo script non e' incluso in $sAPP/index.php, $sAPP/json.php, $sAPP/excel.php, 
		 *
		 */
		 
		fnUpdateLog('APP NOT DEFINED', 0, '', 'E');
		header('Location: ../index.php?sMsg=app-not-defined');
		die();
	} 

	$sScript = fnCurrentScript();
	$sSCRIPT_ROOT_PATH = (fnIsScriptInRoot() ? '.' : '..'); // Variabile utilizzata in template.php

	if (!isset($sWhere) || trim($sWhere)=='') { $sWhere = ' 1 '; }
	
	fnEvaluateTablesAccessLvl($aTABLE_SECURITY_CHECK, false);
	
	// $_GET['sTable'] // Viene definita qual è la tabella da visualizzare
	
	if (fnScriptOutput('excel', $sScript)) {
		if (!is_null(fnReadSessionValue('sTable', 'main-table', $sAPP))) {
			$sTable = fnReadSessionValue('sTable', 'main-table', $sAPP);
		} else {
			$sTable = fnTableDefault($sTABLE_DEFAULT, $aTABLE);	
		}
	} else {
		$sTable = fnGetTableVal('sTable', fnTableDefault($sTABLE_DEFAULT, $aTABLE), '', fnArray2Check($aTABLE)); 
	}
	
	fnTableConst($sTable);
	fnViewConst($sViewItemLink);

	/**
	 * $iAccessLvl	
	 *				
	 *				Se e' definito un valore di $iAccessLvl specifico per la tabella
	 *				viene utilizzato come $iAccessLvl, altrimenti viene utilizzato il valore di 
	 *				$iAccessLvl definito per l'applicazione
	 *
	 */
	 
	$iAccessLvl = (!is_null(fnGetAccessLvl('table', $sTable)) ? fnGetAccessLvl('table', $sTable) : fnGetAccessLvl('app'));
	
	//
	// Inizializzo la variabile $sWhere
	//

	if (trim($sTableSelectWhere) != '1') { $sWhere .= " AND ".$sTableSelectWhere; }
	// l'array $aWhere è stato inizializzata dalla funzione fnEvaluateTablesAccessLvl()
	if (isset($aWhere[$sTableSelectFrom]['sTableSelectWhere'])) { $sWhere .= $aWhere[$sTableSelectFrom]['sTableSelectWhere']; }

		//
		// completamento della variable $sWhere
		//
		
		// $aSelect
		$aSelect = fnSettingsArray($sTable, 'select');
		foreach ($aSelect as $aFilter) {
			if (fnScriptOutput('excel', $sScript)) {
				$$aFilter['sField'] = fnReadSessionValue($aFilter['sField'], 'main-table', $sAPP);
			} else {
				$$aFilter['sField'] = fnGetTableVal($aFilter['sField']);
			}
			if (!empty($$aFilter['sField'])) {
				$sWhere .= fnSelectFilter('sWhere', $aFilter, $sTable);
			}
		}

		// $aRadiob
		$aRadiob = fnSettingsArray($sTable, 'radiob');
		if (fnScriptOutput ('excel', $sScript)) {
			$sShow = fnReadSessionValue('sShow', 'main-table', $sAPP, $sTable);
		} else {
			$sShow = fnGetTableVal('sShow', '', $sTable);
		}	
		foreach ($aRadiob as $aButton)  {
			if (!empty($sShow) && $sShow == $aButton['sAlias'] && $aButton['sField'] != '1') {
				$sWhere .= " AND (".$aButton['sField'].") ";
			}			
		}
		
		// $bSEARCH_FORM_SHOW
		if (isset($bSEARCH_FORM_SHOW) && $bSEARCH_FORM_SHOW) {
			if (fnScriptOutput('excel', $sScript)) {
				$sSearchTerms = fnReadSessionValue('sSearchTerms', 'main-table', $sAPP);
			} else {		
				$sSearchTerms = fnGetTableVal('sSearchTerms');
			}
			$sWhere .= fnSearchFilter('sWhere', $sSearchTerms, $aSearchFields);	
		}

		// $bTagsShow
		if (isset($bTagsShow) && $bTagsShow) { 
			if (fnScriptOutput ('excel', $sScript)) {
				$sTag = fnReadSessionValue('sTag', 'main-table', $sAPP);
			} else {
				$sTag = fnGetTableVal('sTag');
			}			
			$sWhere .= fnTagsFilter('sWhere', $sTag, $sTable, $sAPP);
		}
	
	// die($sWhere); // DEBUG
	
	// $aSettings	
	$aSettings = fnSettingsArray($sTable);
						
	// Array $aFieldsDataType
	fnFieldsDataTypeArray($sTableSelectFrom);

	/**
	 *
	 * OUTPUT
	 *
	 */		
		
	if (fnScriptOutput ('table', $sScript)) {
	
		/**
		 *
		 * INIZIO DEL CODICE PER LA PAGINA index.php ('main-table')
		 *
		 */
		

		$sTableTitle = $sTableDescription;
			 
		if (is_allowed('sysop', $iAccessLvl)) {
			$sTableTitle = "<a href='$sSCRIPT_ROOT_PATH/$sAPP/settings.php?sTable=$sTable'><img class='icon-very-small' src='$sSCRIPT_ROOT_PATH/themes/$sTHEME/images/preferences-small.png' /></a>&nbsp;".$sTableTitle;
		}
				

		$sHeadContent .= "
			<script type='text/javascript' src='../include/dataTables/media/js/jquery.dataTables.js'></script>
			<link type='text/css' href='../include/dataTables/media/css/demo_table.css' rel='stylesheet' />
			
			<script type='text/javascript' src='../include/jquery.prettydate.js'></script>
			
			<script type='text/javascript' src='../include/jquery.cluetip.js'></script>
			<link type='text/css' href='../themes/common/stylesheets/jquery.cluetip.css' rel='stylesheet' />
			
			<script type='text/javascript' src='../include/jquery.cookie.js'></script> ";
	
		$sJsDocumentReady .= "
			setTimeout(function(){ $('.ui-message-flash').fadeOut(); }, 1800);
			
			$.prettyDate.messages = {
				now: 'adesso',
				minute: '1 minuto fa',
				minutes: $.prettyDate.template('{0} minuti fa'),
				hour: '1 ora fa',
				hours: $.prettyDate.template('{0} ore fa'),
				yesterday: 'ieri',
				days: $.prettyDate.template('{0} giorni fa'),
				weeks: $.prettyDate.template('{0} settimane fa')
			}; ";


		/*
		 *
		 * $aTABLE[$sTable]['aSummaryTable']['bShow']
		 *
		 */	 
		 
		if (isset($aTABLE[$sTable]['aSummaryTable']['bShow']) && $aTABLE[$sTable]['aSummaryTable']['bShow']) {
			$sJsDocumentReady .= "
				function fnTableDraw() {
					oTable.fnDraw();
					oSummary.fnDraw();
				} ";		

		} else { 
			$sJsDocumentReady .= "
				function fnTableDraw() {
					oTable.fnDraw();
				} ";	

		}	

		/*
		 *
		 * FORM $aSelect, $aRadiob
		 *
		 */	
		
		if (sizeof($aSelect) > 0 || sizeof($aRadiob) > 0) {
			
			$html .= "<table border='".fnTableBorder()."' cellpadding='0' cellspacing='5'>";
				
			if (sizeof($aSelect) > 0) { 
				
				$html .= "<tr>";
				
				/**
				 * il seguente codice JavaScript stabilisce se è da visualizzare o meno il link
				 * allo script report.php (usato ad esempio in 'budget' per la lettera 'Budget
				 * Report')
				 *
				 */
					
				if (isset($bShowLink2Report) && $bShowLink2Report) { 
					if ($sAPP == 'budget') { 
						$sJsDocumentReady .= "
							function fnLink2ReportShow (iUnita) { 
								if (iUnita != '')
									$('#sidebar-link-report').show();
								else
									$('#sidebar-link-report').hide();
							} ";
					}
				}
		
				foreach ($aSelect as $aFilter) {
					
					$sTableTitle .= fnSelectFilter('sTableTitle', $aFilter, $sTable);			
					
					$aJsVariables[] = $aFilter['sField'];
					
					$sJsVariables .= " var ".$aFilter['sField']." = $('#".$aFilter['sField']."').val(); ";

					$sJsDocumentReady .= "
						$('#".$aFilter['sField']."').change( function() { ".$aFilter['sField']." = $(this).val(); ";
							
							/**
							 *
							 * 1/3 campo 'iDipartimento'
							 *
							 */
							 
							if ($aFilter['sField'] == 'iDipartimento' && in_aSelect('iUnita')) {
								$sJsDocumentReady .= "
									$('#iUnita').attr('disabled', 'disabled'); /* disabilito il campo per evitare interferenze da parte dell'utente con le operazioni che verranno eseguite qui di seguito */
									$.getJSON('select.php', {'sSource': '".$aFilter['sField']."', '".$aFilter['sField']."': ".$aFilter['sField'].", 'iShowAllResources': 0, 'sTable': '$sTable' }, function(json) {
										var options = '';
										for (var i = 0; i < json.length; i++) {
											options += \"<option value='\" + json[i].iOptionValue + \"'>\" + json[i].sOptionDisplay + \"</option>\"; }
										$('#iUnita').html(options);
										$('#iUnita option:first').attr('selected','selected');
										iUnita = $('#iUnita :selected').val();
										$('#iUnita').removeAttr('disabled');
										
										if (iUnita == '') {
											$('.table-title-more#sUnita').hide(); /* Aggiorno il titolo della tabella (iUnita) */
										} else {
											$('.table-title-more#sUnita').show(); /* Aggiorno il titolo della tabella (iUnita) */
											$('.table-title-more#sUnita .table-title-value').text($('#iUnita :selected').text()); /* Aggiorno il titolo della tabella (iUnita) */
										}									
										
										fnUpdateInputFields('iUnita', iUnita, '.sidebar-form');
										fnUpdateInputFields('iUnita', iUnita, '#search-form');
			
										fnTableDraw();
										
										/* Aggiorno il link 'reset' nel titolo della tabella */
										fnTableTitleResetShow();
										
										/* Link a report.php */
										".($sAPP=='budget' && isset($bShowLink2Report) && $bShowLink2Report ? "fnLink2ReportShow(iUnita);" : '')."							
									}); ";
							
							/**
							 *
							 * 2/3 campo 'iUnita'
							 *
							 */
							 
							} else if ($aFilter['sField'] == 'iUnita' && in_aSelect('iDipartimento')) {
								$sJsDocumentReady .= "
									$.getJSON('select.php', {'sSource': '".$aFilter['sField']."', '".$aFilter['sField']."': ".$aFilter['sField'].", 'iDipartimento': iDipartimento, 'iShowAllResources': 0, 'sTable': '$sTable' }, function(json) {
										if (iDipartimento != json[0].iOptionValue) {
											$('#iDipartimento').attr('disabled', 'disabled'); /* disabilito il campo per evitare interferenze da parte dell'utente con el operazioni che verranno eseguite qui di seguito */
											$('#iDipartimento option[value='+json[0].iOptionValue+']').attr('selected', 'selected');
											iDipartimento = $('#iDipartimento :selected').val();
											$('#iDipartimento').removeAttr('disabled');
										
											/* modifico il campo select iUnita in modo da mostrare solo le unità facenti parte dello stesso dipartimento dell'unità selezionata */
											$('#iUnita').attr('disabled', 'disabled'); /* disabilito il campo per evitare interferenze da parte dell'utente con el operazioni che verranno eseguite qui di seguito */
											$.getJSON('select.php', {'sSource': 'iDipartimento', 'iDipartimento': iDipartimento, 'iUnita': iUnita, 'iShowAllResources': 0, 'sTable': '$sTable' }, function(json) {
												var options = '';
												for (var i = 0; i < json.length; i++) {
													options += \"<option value='\" + json[i].iOptionValue + \"'>\" + json[i].sOptionDisplay + \"</option>\"; }
												$('#iUnita').html(options);
												$('#iUnita').val(iUnita);
												$('#iUnita').removeAttr('disabled');
											});
										
											if (iDipartimento == '') {
												$('#.table-title-more#sDipartimento').hide(); /* Aggiorno il titolo della tabella (iDipartimento) */
											} else {
												$('#.table-title-more#sDipartimento').show(); /* Aggiorno il titolo della tabella (iDipartimento) */
												$('.table-title-more#sDipartimento .table-title-value').text($('#iDipartimento :selected').text()); /* Aggiorno il titolo della tabella (iDipartimento) */
											}
										
											fnUpdateInputFields('iDipartimento', iDipartimento, '.sidebar-form');
											fnUpdateInputFields('iDipartimento', iDipartimento, '#search-form');
										}
											
										fnTableDraw();
										
										/* Aggiorno il link 'reset' nel titolo della tabella */
										fnTableTitleResetShow();
										
										/* Link a report.php */
										".($sAPP=='budget' && isset($bShowLink2Report) && $bShowLink2Report ? "fnLink2ReportShow(iUnita);" : '')."
									}); ";
							
							/**
							 *
							 * 3/3 tutti i rimanenti campi (ovvero tutti i campi diversi da 'iDipartimento' e 'iUnita')
							 *
							 */
							 
							} else { 
								$sJsDocumentReady .= "
									fnTableDraw();

									/* Aggiorno il link 'reset' nel titolo della tabella */
									fnTableTitleResetShow(); ";
							
							}
							
							/**
							 *
							 * codice Javascript comune a tutti i campi (inclusi 'iDipartimento' e 'iUnita')
							 *
							 */
							 
							$sJsDocumentReady .= "							
									if (".$aFilter['sField']." == '') {
										$('.table-title-more#".$aFilter['sAlias']."').hide();
									} else {
										$('.table-title-more#".$aFilter['sAlias']."').show();
										$('.table-title-more#".$aFilter['sAlias']." .table-title-value').text($('#".$aFilter['sField']." :selected').text());
									}
			
									/* Aggiorno i campi nascosti nella barra laterale */
									fnUpdateInputFields('".$aFilter['sField']."', ".$aFilter['sField'].", '.sidebar-form');
									fnUpdateInputFields('".$aFilter['sField']."', ".$aFilter['sField'].", '#search-form');
								
								}); ";
							
							$sJsDocumentReady .= "										
								
								/**
								 * Le seguenti righe mi servono per impostare correttamente il titolo
								 * della pagina quando eseguto la pagina con un qualche parametro che fa
								 * riferimento ad un parametro iSelectShow... ad esempio:
								 * 
								 * ... /budget/index.php?sTable=budget&iDipartimento=26
								 * ... /global/index.php?sTable=collaudi-nc&iReferente=1
								 */
								 
								if (".$aFilter['sField']." == '') {
									$('.table-title-more#".$aFilter['sAlias']."').hide();
								
								} else {
									if ('".$aFilter['sField']."' == 'iDipartimento' && iUnita != '') {										
										/**
										 * Nel caso in cui siano specificati sia iDipartimento che iUnita,
										 * ignoro le informazioni del campo iDipartimento (successivamente
										 * l'informazione azzerata viene recuperata eseguendo $('#iUnita').change();)
										 */
										iDipartimento = '';
										
									} else if ('".$aFilter['sField']."' == 'iUnita') {
										/**
										 * Nel caso in cui sia specificato un valore per il campo iUnita,
										 * eseguo la funzione .change()
										 */
										 $('#".$aFilter['sField']."').change();
									
									} else {
										/**
										 * In tutti gli altri casi (campo != da iDipartimento e da iUnita)
										 * completo il titolo sistemando ciò che si deve e ciò che non si deve visualizzare...
										 */
										$('.table-title-more#".$aFilter['sAlias']."').show();
										$('.table-title-more#".$aFilter['sAlias']." .table-title-value').text($('#".$aFilter['sField']." :selected').text());
									
									}
								} ";
							
					$html .= '<td>'.fnSelectFilter('html', $aFilter, $sTable).'</td>';

				}
				
				$html .= "</tr>";
				
			}
	
			if (sizeof($aRadiob) > 0) {
				
				$sShowAllRecords = '';
				foreach ($aRadiob as $aButton)  {
					if ($aButton['sField'] == 1) 
						
					/**
					 * trovo il valore di sAlias per il campo '$sShowAllRecords', ovvero il campo che
					 * visualizza tutti i record della tabella
					 */
						 
					$sShowAllRecords = $aButton['sAlias'];	
				}
				
				$bIsValidRadiob = fnIsValidRadiob($sTable, $sShow);
				
				$aJsVariables[] = "sShow";
				$sJsVariables .= " var sShow = ($(\"input[name='sShow']:checked\").val()=='$sShowAllRecords' ? '' : $(\"input[name='sShow']:checked\").val()); ";
				
				$sJsDocumentReady .= "
					$(\"input[name='sShow']\").change( function() {		
	
						sShow = ($(this).val()=='$sShowAllRecords' ? '' : $(this).val());
	
						fnTableDraw();
	
						/* Aggiorno il titolo della tabella */
						fnTableTitleResetShow();
						
						if (sShow == '') {
							$('#table-title-radiob').hide();
						} else {
							$('#table-title-radiob').show();
							$('#table-title-radiob .table-title-value').hide();
							$('#table-title-radiob #' + sShow).show();
						}
	
						/* Aggiorno i campi nascosti nella barra laterale */
						fnUpdateInputFields('sShow', sShow, '#search-form');
					});
					
					/**
					 * Dopo aver caricato la pagina, sistemo il titolo. Mi serve quando richiamo
					 * la pagina con dei parametri, ad esempio 'index.php?sShow=pr_9'.
					 * Preferisco non eseguire direttamente l'evento .change() per non ridisegnare
					 * una seconda volta la tabella, ossia per non eseguire inutilmente fnTableDraw();
					 */
					 					
					if (sShow == '') {
						$('#table-title-radiob').hide();
					
					} else {
						$('#table-title-radiob .table-title-value').hide();
						$('#table-title-radiob #' + sShow).show();
					
					} ";
	
				$html  .= "<tr><td colspan='".(sizeof($aSelect))."'>";
				
				$html  .= "<table border='".fnTableBorder()."' cellpadding='0' cellspacing='0'><tr>";
	
				$sTableTitle .= "<span class='table-title-more' id='table-title-radiob'> &raquo; ";
				
				foreach ($aRadiob as $aButton)  {
					
					$html .= "<td><input type='radio' name='sShow' value='".$aButton['sAlias']."' ".
						($sShow == $aButton['sAlias'] || ((empty($sShow) || !$bIsValidRadiob) && $aButton['sAlias'] == $sShowAllRecords) ? ' checked ' : '').
						"></td>";
					$html .= "<td><img src='images/".$aButton['sAlias'].".png' title='".$aButton['sLabel']."' alt='".$aButton['sLabel']."'>&nbsp;&nbsp;</td>";
					
					if ($aButton['sAlias'] != $sShowAllRecords) {
						$sTableTitle .= "<span class='table-title-value' id='".$aButton['sAlias']."' style='display:".
						(!empty($sShow) && $sShow == $aButton['sAlias'] ? '' : 'none').";'>".$aButton['sLabel']."</span>";			
					}
						
				}

				$html .= "</tr></table>";
				
				$html .= "</td></tr>";
	
				$sTableTitle .= "</span>";
			
			}

			$html .= '</table>';
		
		} else  {
			
			/**
			 * Inserisco una tabella vuota in modo da non avere main-table incollata alla linea del
			 * titolo della tabella
			 */
			 
			$html .= "<table border='".fnTableBorder()."' cellpadding='0' cellspacing='5'><tr><td>&nbsp;</td></tr></table>";
		
		}
	
	
		if (isset($aTABLE[$sTable]['aSummaryTable']['bShow']) && $aTABLE[$sTable]['aSummaryTable']['bShow']) {
			$html .= fnDivSummary('html', $sTable, $aTABLE[$sTable]['aSummaryTable']);
			$sJsDocumentReady .= fnDivSummary('jsDocumentReady', $sTable, $aTABLE[$sTable]['aSummaryTable']);
		}
		
		// Titolo della pagina
		$sHeaderTitle = $sAPP_NAME." &raquo; ".strip_tags($sTableDescription);

		if ($sTable=='trash' || $sTable=='cestino') {
			
			$html .= "	<div class='table-title-help ui-state-highlight ui-corner-all'>
							<img src='../themes/common/images/trash-16x16.png'>
							<span>Le schede nel cestino verranno eliminate definitivamente dopo $iMAX_DAYS_IN_TRASH giorni.</span>
						</div>";
			/**
			 * Quando visualizzo il cestino  eseguo automaticamente la query che elimina
			 * tutte le schede cancellate più di $iMAX_DAYS_IN_TRASH (numero definito in const.inc.php) giorni fa
			 */
			 
			$sQuery = fnQueryDeleteFromTrash($aForms[$iTabDefault]['sFormTable'], $sViewSelectFrom, 0, $iMAX_DAYS_IN_TRASH);
			$rResult = custom_mysql_query($sQuery, 'fnQueryDeleteFromTrash()');

		}	
		
		// Inizio della tabella
		$html .= "<table border='".fnTableBorder()."' id='main-table' class='display dataTable' cellpadding='0' cellspacing='0' >";
			
			// riga con i titoli delle colonne della tabella
			$html .= "<thead>";
				$html .= "<tr>";
					
					$iColumnIndex = 0;
					$aColumnDefs = array();
					
					// Titoli delle colonne della tabella
					
					foreach ($aSettings as $aField)  {
						
						$sField = ($aField['sAlias'] == '' ? $aField['sField'] : $aField['sAlias']);
						
						// 14/03/2011 in alcuni casi è necessario utilizzare gli apici ` nel nome del campo (ad esempio per 
						// `tsMailMANAGER-SIC`). Gli apici sono necessari solo per la query MySQL, per recuperare il dato 
						// dall'array $aRow occorre eliminare l'apice iniziale e quello finale 
						if (substr($sField, 0, 1)=='`' && substr($sField, -1, 1)=='`')
							$sField = substr($sField, 1, strlen($sField)-2);
							
						$iFieldAccessLvl = fnFieldAccesslvl($iAccessLvl, '', 0, $sField);
						
						if (is_allowed('view', $iFieldAccessLvl)) {
							
							if (($aField['iTableShow'] == 1 || $aField['iExcelShow'] == 1) || $aField['sField'] == 'id')  {
								
								if ($aField['iTableShow'] == 1) {
									$aColumnDefs['bVisible']['true'][] = $iColumnIndex;
								} else {
									$aColumnDefs['bVisible']['false'][] = $iColumnIndex;
								}	
								if ($aField['iSortable'] == 0) {
									$aColumnDefs['bSortable']['false'][] = $iColumnIndex;
								}
								if ($aField['sWidth'] != '') {
									$aColumnDefs['sWidth'][$aField['sWidth']][] = $iColumnIndex;
								}	
								
								$aColumnDefs['sName'][$sField][] = $iColumnIndex;
								
								$iColumnIndex++;	
								
								// 14/03/2011 i titoli dei campi 'timestamp' e 'checkbox' vengono visualizzati
								// con una scritta un po' piu' piccola rispetto agli altri titoli (class='small-text')
								
								// 21/03/2011 definito 'iError' come un nome di campo riservato per l'applicazione.
								// anche in questo caso il titolo viene visualizzato con un font leggermente più piccolo rispetto al normale
								
								$html .= "<th class='$sField".(fnCheckFieldsDataType($sField, 'timestamp') || fnCheckFieldsDataType($sField, 'checkbox') || $sField=='iError' ? " small-text" : '')."'>".(!empty($aField['sLabel']) ? $aField['sLabel'] : "&nbsp;")."</th>";
							}
							
						}
						
					}
					
					$sColumnDefs = $sColumnTargets = '';
					
					foreach ($aColumnDefs as $sProperty => $aValues) {
						foreach ($aValues as $sValue => $aTargets) {
							foreach ($aTargets as $iTarget) {
								$sColumnTargets .= $iTarget.", ";
							}
							$sColumnTargets = substr_replace($sColumnTargets, '', -2);
						$sColumnDefs .= " { \"$sProperty\": ".(($sValue=='false' || $sValue=='true') ? $sValue : "\"$sValue\"").", \"aTargets\": [ $sColumnTargets ] }, ";
						$sColumnTargets = "";
						}
					}
					$sColumnDefs = substr_replace($sColumnDefs, '', -2);
					
					$iNumColumns = $iColumnIndex;
					
				$html .= "</tr>";
			$html .= "</thead>";
			
			// contenuto tabella
			$html .= "<tbody>";
				$html .= "<tr>";
					$html .= "<td colspan='$iNumColumns' class='dataTables_empty'>Lettura dei dati in corso...</td>";
				$html .= "</tr>";
			$html .= "</tbody>";
	
		$html .= "</table>";
		
			
		/*					*/
		/* Toggable */
		/*		    	*/
		
		if (isset($aFieldsDataType['checkbox']) && !empty($aFieldsDataType['checkbox'])) {
			
			$bCheckboxEditable = false;
			foreach ($aFieldsDataType['checkbox'] as $sField) {
				$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, $sField);
				if (is_allowed('edit', $iFieldAccessLvl)) {
					$bCheckboxEditable = true;
				}
			}
			
			if ($bCheckboxEditable) { // c'è almeno un campo checkbox che è modificabile dall'utente
				$sDrawCallback .= "
					$('.ui-toggable').click(function() {
						fnToggle($(this));
					});	";

				$sJsDocumentReady .= "				
					function fnToggle (oObj) {
						src = oObj.attr('src'),
							onCheck = /\_on\.png$/,
							offCheck = /\_off\.png$/;
						$.getJSON('../include/toggle.php', {'sAction': 'toggle', 'sField': oObj.attr('sField'), 'sValue': (src.match(onCheck) ? 0 : 1), 'iView': oObj.attr('iView'), 'sTable': oObj.attr('sTable'), 'sAPP': '$sAPP' }, function (json) {
							if (json[0].sAction=='toggle' && json[0].sError=='') { 
								if(src.match(onCheck)) {
									oObj.attr('src', src.replace(onCheck, '_off.png'));
								} else if (src.match(offCheck)) {
									oObj.attr('src', src.replace(offCheck, '_on.png'));
								}
							} else { 
								alert ('Error: ' + json[0].sError);
							} 		
						})
					} ";
			}
		}
		
		/*			      		*/
		/* $sMessageFlash */
		/*			      		*/
		
		$sMessageFlash = fnMessageFlash();
		
		/*			 			*/
		/* $sNewItem 	*/
		/*			 			*/

		if (isset($sNewItemLink) && !empty($sNewItemLink) && is_allowed('edit', $iAccessLvl)) {
			$sNewItem = "<a href='$sNewItemLink'>$sNewItemLabel &raquo;</a>";
		}
		
		/*			         			*/
		/* $bSEARCH_FORM_SHOW */
		/*			         			*/
		
		if (isset($bSEARCH_FORM_SHOW) && $bSEARCH_FORM_SHOW) {
			
			// $sHtmlSearchForm, $sJsDocumentReady
			$sHtmlSearchForm = fnHtmlSearchForm($sSEARCH_FORM_LABEL, $bTagsShow, $sTable, $sSearchTerms);
			
			$sTableTitle .= fnSearchFilter('sTableTitle', $sSearchTerms, $aSearchFields);
			
			$sJsVariables .= " var sSearchTerms = ($('#sSearchTerms').val()=='$sSEARCH_FORM_LABEL' ? '' : $('#sSearchTerms').val()); ";
			$aJsVariables[] = 'sSearchTerms';
			
			$sJsDocumentReady .= "
					$('#sSearchTerms').keyup( function() {
		
						sSearchTerms = ($(this).val()=='$sSEARCH_FORM_LABEL' ? '' : $(this).val());			

						fnTableDraw();
		
						/* Aggiorno il titolo della tabella */
						fnTableTitleResetShow();
						
						if (sSearchTerms == '') {
							$('#table-title-search').hide();
						} else {
							$('#table-title-search').show();
							$('#table-title-search .table-title-value').text(sSearchTerms);
						}
		
						/* Aggiorno i campi nascosti nella barra laterale */
						fnUpdateInputFields('sSearchTerms', sSearchTerms, '.sidebar-form')
		
					} );
					
					/**
					 * Dopo aver caricato la pagina, sistemo il titolo. Mi serve quando richiamo
					 * la pagina con dei parametri, ad esempio 'index.php?sSearchTerms=test'.
					 * Preferisco non eseguire direttamente l'evento .keyup() per non ridisegnare
					 * una seconda volta la tabella, ossia per non eseguire inutilmente fnTableDraw();
					 *
					 */
					 
					if (sSearchTerms == '') {
						$('#table-title-search').hide();
					} else {
						$('#table-title-search .table-title-value').text(sSearchTerms);
					} ";
							
	
			// OpenSearch XML
			$sOpenSearchXML = "<link rel='search' type='application/opensearchdescription+xml' href='../include/opensearch_desc.php?sAPP=$sAPP' title='$sAPP_NAME' />";
	
		}

		//
		// SIDEBAR
		//
		
		// SIDEBAR >> ELENCO TABELLE ($sTable)
		$sSidebarTitle = '';
		$sSidebar = fnLinks2Tables($sTable, $bSEARCH_FORM_SHOW, $bTagsShow); 
				
		//
		// SIDEBAR >> AZIONI ($sSidebarActions)
		//
		
		// $sSidebarActionsTitle
		$sSidebarActionsTitle = 'Azioni';
		
		// SIDEBAR >> EXCEL EXPORT (excel.php)
		if (isset($bShowLink2ExcelExport) && $bShowLink2ExcelExport) {
			$sSidebarActions .= "	<dd>
										<a href='excel.php'>
										<img alt='Excel' src='../themes/common/images/page_excel.png' />Esporta in Excel</a>
									</dd>";
		}
		
		// SIDEBAR >> REPORT (report.php)
		if (isset($bShowLink2Report) && $bShowLink2Report) {
			$sSidebarActions .= "	<dd>
										<a href='./report.php' id='sidebar-link-report' target='_report'>
										<img alt='report' src='images/report.png' />Report</a>
									</dd>";
			$sJsDocumentReady .= " fnLink2ReportShow(iUnita); ";
		}

		//
		// SIDEBAR >> TAGS
		//

		if (isset($bTagsShow) && $bTagsShow) {
			
			// SIDEBAR >> TAGS >> CODICE JAVASCRIPT
			
			$sTableTitle .= fnTagsFilter('sTableTitle', $sTag, $sTable, $sAPP);
			$aJsVariables[] = 'sTag';
			$sJsVariables .= " var sTag = $('#sTag').val(); ";
			
			$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, 'tags');

			if (is_allowed('view', $iFieldAccessLvl)) { 
				
				$sJsDocumentReady .= "
				
					$('#tags-selectable').selectable({
						stop: function(){
							
							var selection = '';
							var result = $('#tags-select-result').empty();
							
							if ($('.ui-selected', this).length > 0) {
								
								$('.ui-selected', this).each(function(){
									selection += ('|' + $(this).attr('iTag'));
									result.append(' | ' + $(this).attr('iTag'));
								});
								$('#sTag').attr('value', selection);
								sTag = $('#sTag').val();
								
								fnTableDraw();
		
								/* Aggiorno il titolo della tabella */
								
								fnTableTitleResetShow();
								
								if ($('.ui-selected', this).length = 0) {
									$('#table-title-tags').hide();
								} else {
									$('#table-title-tags').show();
									$('#table-title-tags .table-title-value').hide();
									$('.ui-selected', this).each(function(){
										$('#table-title-tags .table-title-value#' + $(this).attr('iTag')).show();							
									})
								}
		
								/* Aggiorno i campi nascosti nella barra laterale */					
								fnUpdateInputFields('sTag', sTag, '.sidebar-form');
								fnUpdateInputFields('sTag', sTag, '#search-form');
							
							}
						}
					});
				
					$('#tags-reset').click(function() {
					
						$('.ui-selected').removeClass('ui-selected');
					 	$('#tags-select-result').empty();
					 	
					 	/* Svuoto il valore nel campo di input nascosto */
					 	sTag = '';
					 	$('#sTag').attr('value', sTag);

					  	fnTableDraw();
					  	
					  	/* Aggiorno il titolo della tabella */
					  	fnTableTitleResetShow();
					  	$('#table-title-tags').hide();
					  	
					  	/* Aggiorno i campi nascosti nella barra laterale */	
					  	fnUpdateInputFields('sTag', sTag, '.sidebar-form');
					  	fnUpdateInputFields('sTag', sTag, '#search-form');
					  	
					}); ";
			}
			
			if (is_allowed('edit', $iFieldAccessLvl)) { 
				
				$sDrawCallback .= "
					
					$('.tags-remove').click(function() {
						fnTagsRemove($(this));
					}); ";		
		
		
				$sJsDocumentReady .= "

					$('li', '#tags-selectable').droppable({
						accept: '.draggable',
						hoverClass: 'ui-state-active',
						drop: function(event, ui) {
							iTag = $(this).attr('iTag');
							ui.draggable.fadeOut();
							fnTagsAdd(iTag, ui.draggable);
						}
					});
				
					function fnTagsAdd(iTag, oObj) {
						$.getJSON('../include/tagging.php', {'sAction': 'tags-add-table', 'iTag': iTag, 'iView': oObj.attr('iView'), 'sTable': '$sTable', 'sAPP': '$sAPP' }, function (json) {
							if (json[0].sAction=='tags-add-table' && json[0].sError=='') { 
								
								fnTableDraw();
								
								// utilizzo fnTableDraw(); e non l'istruzione riportata qui sotto
								// perchè altrimenti nel record modificato non ho di nuovo a
								// disposizione l'icona per assegnare una categoria attraverso il
								// 'drag and drop'.
								// $('#tags-show-' + oObj.attr('iView')).html(json[0].sHtml);
								
							} else { 
								
								alert ('Error: ' + json[0].sError);
							
							} 						
						});
					}
	
					function fnTagsRemove(oObj) {
						$.getJSON('../include/tagging.php', {'sAction': 'tags-remove-table', 'iTag': oObj.attr('iTag'), 'iView': oObj.attr('iView'), 'sTable': '$sTable', 'sAPP': '$sAPP' }, function (json) {
							if (json[0].sAction=='tags-remove-table' && json[0].sError=='') { 
								oObj.parent('li').fadeOut();
							} else { 
								alert ('Error: ' + json[0].sError);
							} 		
						});
					} ";
			}
			
			// SIDEBAR >> TAGS >> CODICE HTML
			
			$sSidebarTagsTitle = "Categorie";
			
			$sSidebarTags = fnTagsView('main-table', 0, '', $sTable, $sTag, $sAPP);
			
			
		}			 

		
		//
		$sJsDocumentReady .= "
			function fnUpdateInputFields(sWhat, sValue, sWhere) {		
				/* Aggiorno campi nascosti */
				aToBeUpdated = $('input[name = ' + sWhat + ']', sWhere);
				if (aToBeUpdated.length > 0) {
					for (var i = 0; i < aToBeUpdated.length; i++) {
						aToBeUpdated[i].value = sValue;
					}			
				}
			} ";
	

		
		$sJsDocumentReady .= "
			$('#table-title-reset').click(function() {
				$('#sidebar-form-".$sTable."').submit();
			});	";
		
		$sTableTitle .= "<font id='table-title-reset'>(annulla filtri impostati)</font>";		
		
		$sJsDocumentReady .= "
			function fnTableTitleResetShow()  {
				$('#table-title-reset').hide(); ";
			foreach ($aJsVariables as $sJsVar) {
				$sJsDocumentReady .= "
					if ($sJsVar != '') {
						$('#table-title-reset').show();
						// alert('$sJsVar: ' + $sJsVar); // debug
					} ";
				$sAoDataPush .= " { 'name': '$sJsVar', 'value': $sJsVar }, ";
			}
			$sJsDocumentReady .= " }; ";
			
		$sJsDocumentReady .= "			
			fnTableTitleResetShow(); ";
			
		
		// DEBUG XMLHttpRequest
		if (is_allowed('sysop', $iAccessLvl)) {
			$sJsDocumentReady .= "
				$.ajaxSetup({'error':	function(XMLHttpRequest,textStatus, errorThrown) {   
				      						alert(textStatus);
				    						alert(errorThrown);
				     						alert(XMLHttpRequest.responseText);
										}
				}); ";
		}	
		
		//
		// PARAMETRI TABELLA
		//
		
		// ORDINAMENTO COLONNE
		if (isset($_GET['iSortingCols']) && $_GET['iSortingCols'] > 0) {
			$sSorting .= " [";
			for ($i=0; $i<$_GET['iSortingCols']; $i++) {
				$sSorting .= "[ ".$_GET['iSortCol_'.$i].", \"".$_GET['sSortDir_'.$i]."\" ],";
			}
			$sSorting = substr_replace( $sSorting, "", -1 )."] ";
		} else {
			// la colonna '0' è il campo 'id' della tabella, ed io voglio che l'ultima scheda inserita sia visualizzata per prima sulla prima pagina
			$iSortingCol = '0';
			$sSorting = " [[ $iSortingCol, \"desc\" ]] ";
		} 
		
		// NUMERO DI RECORDA DA VISUALIZZARE IN TABELLA
		$iDisplayLength = $iTABLE_DISPLAY_LENGTH;
		if (isset($_GET['iDisplayLength']) && !empty($_GET['iDisplayLength'])) {
			$iDisplayLength = $_GET['iDisplayLength'];
		}
		
		// PRIMO RECORD DA VISUALIZZARE IN TABELLA
		$iDisplayStart = 0;
		if (isset($_GET['iDisplayStart']) && !empty($_GET['iDisplayStart'])) {
			$iDisplayStart = $_GET['iDisplayStart'];
		}

			
		//
		///
		//// FINE DEL CODICE PER LA PAGINA 'main-table'
		///
		//
			
	}
	
	else if (fnScriptOutput ('json', $sScript)) {

		//
		///
		//// INIZIO DEL CODICE PER LA PAGINA 'json'
		///
		//
	
		if ($_GET['sWhat'] == "main-table") {

			/* Paging */
			$sLimit = "";
			if ( isset( $_GET['iDisplayStart'] ) ) {
				$iDisplayStart = fnGetTableInt('iDisplayStart', 0, $sTable);
				$iDisplayLength = fnGetTableInt('iDisplayLength', $iTABLE_DISPLAY_LENGTH, $sTable);
				if ($_GET['iDisplayLength'] != '-1') // ($_GET['iDisplayLength'] == '-1') shows all records
					$sLimit = "LIMIT ".mysql_real_escape_string($iDisplayStart).", ".
						mysql_real_escape_string($iDisplayLength);
			}
			
			/* Ordering */
			if ( isset( $_GET['iSortCol_0'] ) )
			$iSortingCols = fnGetTableInt('iSortingCols', 0, $sTable); {
				$sOrder = "ORDER BY  ";
				for ( $i=0 ; $i<$iSortingCols ; $i++ ) {
				
					$iSortCol = 'iSortCol_'.$i;
					$$iSortCol = fnGetTableInt($iSortCol, 0, $sTable);
					$sSortDir = 'sSortDir_'.$i;
					$$sSortDir = fnGetTableVal($sSortDir, '', $sTable);
					
						$sOrder .= fnColumnToField($$iSortCol, $aSettings )."
						 	".$$sSortDir .", ";
				}
				$sOrder = substr_replace($sOrder, "", -2)." ";
			}
	
			$sQueryFields ='';
			
			foreach ($aSettings as $aField) {
				$sField = ($aField['sAlias']=='' ? $aField['sField'] : $aField['sAlias']);
				$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, $sField);
				if (is_allowed('view', $iFieldAccessLvl)) {
					if (($aField['iTableShow'] == 1 || $aField['iExcelShow'] == 1) || $aField['sField'] == 'id') {
						$sQueryFields .= " ".$aField['sField'].(!empty($aField['sAlias']) ? " AS ".$aField['sAlias'] : "").", ";
					}
				}
			}
			
			$sQueryFields =  substr($sQueryFields, 0, -2)." "; // substr perchè gli ultimi due caratteri della stringa sono  ", "
		
			$sQuery = "
				SELECT SQL_CALC_FOUND_ROWS 
				$sQueryFields
				FROM $sTableSelectFrom
				WHERE $sWhere ".
				($sTableSelectGroupBy != "" ? " GROUP BY $sTableSelectGroupBy " : "")."
				$sOrder
				$sLimit
			";

			$rResult = custom_mysql_query( $sQuery);
			
			$sQuery = "
				SELECT FOUND_ROWS()
			";
			$rResultFilterTotal = custom_mysql_query( $sQuery);
			$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
			$iFilteredTotal = $aResultFilterTotal[0];
			
			$sQuery = "
				SELECT COUNT(id)
				FROM $sTableSelectFrom WHERE $sTableSelectWhere
			";
			$rResultTotal = custom_mysql_query( $sQuery);
			$aResultTotal = mysql_fetch_array($rResultTotal);
			$iTotal = $aResultTotal[0];
			
			$sOutput = '{';
			$sOutput .= '"sEcho": '.intval($_GET['sEcho']).', ';
			$sOutput .= '"iTotalRecords": '.$iTotal.', ';
			$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
			$sOutput .= '"aaData": [ ';
			
			while ($aRow = mysql_fetch_array($rResult)) {
				
				$sOutput .= "[";

				foreach ($aSettings as $aField)  {
					
					$sField = ($aField['sAlias']=='' ? $aField['sField'] : $aField['sAlias']);
				
					// 14/03/2011 in alcuni casi è necessario utilizzare gli apici ` nel nome del campo (ad esempio per 
					// `tsMailMANAGER-SIC`). Gli apici sono necessari solo per la query MySQL, per recuperare il dato 
					// dall'array $aRow occorre eliminare l'apice iniziale e quello finale 
					if (substr($sField, 0, 1)=='`' && substr($sField, -1, 1)=='`')
						$sField = substr($sField, 1, strlen($sField)-2);
					
					$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, $sField);
		
					if (is_allowed('view', $iFieldAccessLvl)) {
					
						if (($aField['iTableShow'] == 1 || $aField['iExcelShow'] == 1) || $aField['sField'] == 'id')  {

							$sValue = preg_replace('/[\n\r]/','<br/>', $aRow[$sField]);
		
							if (fnCheckFieldsDataType($sField, 'currency')) {
								if (empty($aRow[$sField])) {
									$sValue = '';
								} else {
									$bNegative  = ($sValue < 0 ? true : false); // negative
									$sValue = number_format($sValue, (intval($sValue) != $sValue ? 2 : 0), ',', '.');
									if (isset($aNegativeValueHighlight) && in_array($sField, $aNegativeValueHighlight)) {
										$sValue = "<span class='".($bNegative ? 'negative-value' : 'positive-value')."'>".$sValue."</span>";
									}
								}
							}
		
							else if (fnCheckFieldsDataType($sField, 'date')) {
								$bExpired  = (strtotime($aRow[$sField])-strtotime('now') < 0 ? true : false); // expired
								$sValue = date_convert($sValue, 'html');
								if (isset($aExpiredValueHighlight) && in_array($sField, $aExpiredValueHighlight) && $sValue != '&nbsp;') {
									$sValue = "<span class='".($bExpired ? 'expired-value' : 'not-expired-value')."'>$sValue</span>";
								}
							}
							
							// 21/03/2011 'iError' è un nome di campo riservato all'applicazione
							
							else if ($sField == "iError") {
								if (!empty($aRow[$sField])) {
									$sValue = "<div class='center'><img alt='".$aField['sLabel']."' title='".$aField['sLabel']."' src='../themes/common/images/star_on_sm_2.gif' border='0' /></div>";
								} else {
									$sValue = '&nbsp;';
								} 
							}
							
							else if (fnCheckFieldsDataType($sField, 'checkbox')) {
								if ($sField != 'iNotShared' || ($sField == 'iNotShared' && $aRow['sCreatedby'] == fnReadSessionValue('sUsername'))) {
									
									if ($sAPP == 'global' && $sTable == 'collaudi-nc' && $sField == 'iArchivio' && ($aRow['sErroriScheda']=='' && $aRow['sErroriAsset']=='' && $aRow['sErroriCritici']=='' && $aRow['sFrequenzaSolleciti']=='')) {
											
											// 21/03/2011 questa istruzione if è stata inserita affinchè, nella tabella delle non conformità dei collaudi, il checkbox
											// 'efficacia correzioni' non venga visualizzato qualora nella scheda non siano stati presenti errori
											$sValue = '&nbsp;';
									
									} else {
										
										$sFilename = "images/".strtolower(substr($sField,1));
										if (!file_exists($sFilename."_on.png") || !file_exists($sFilename."_off.png")) {
											$sFilename = "../themes/common/images/wcheck";
										}
										$sValue = "<div class='center'><img alt='".$aField['sLabel']."' title='".$aField['sLabel']."' src='$sFilename".($aRow[$sField] == 1 || $aRow[$sField] == 'X' ? '_on' : '_off').".png' border='0' ";
										if (is_allowed('edit', $iFieldAccessLvl)) { $sValue .= " sField='$sField' iView=".$aRow['id']." sTable='$sTable' class='ui-toggable' "; }
										$sValue .= " /></div>";
										
									}
									
								} else {
									$sValue = '&nbsp;';
								}
							}

							else if ($sField == "sPriorita") {
								$sValue = ($aRow[$sField] != '' ? "<div class='center'><img src='images/pr_".$aRow[$sField].".png' border='0'  /></div>" : '');
							}
							
							else if (fnCheckFieldsDataType($sField, 'timestamp')) {
								$sValue = fnHtmlTimestamp($aRow[$sField]);
							}
							
							else if ($sField == "iShowDetails") {
								$sValue = "<div class='center'><img src='../themes/common/images/information.png' border='0' /></div>";
							}
			
							else if ($sField == "iShowNote") {
								$sValue = ($aRow['sNote'] != '' ? "<div class='center'><img src='../themes/common/images/note.png' border='0' /></div>" : '');
							}

							else if ($sField == "iShowTags") {
								$sValue =  "<div class='tags-show' id='tags-show-".$aRow['id']."'>".fnTagsView('view', $aRow['id'], '', $sTable, '', $sAPP, true, true, false)."</div>";
							}
							
							else if ($sField == "iShowLastCheckIconFile") {
								$sValue = "<div class='center'><img src='../themes/common/images/".fnLastCheckView('sIconFile', $aRow['id'])."' border='0' /></div>";
							}
							
							else if (substr($sField, 0, 6) == "iEsito") {
								
								/**
								 * 10/03/2011 Le seguenti istruzioni sono state inserite per permettere di
								 * avere le icone degli esiti dei controlli di colore diverso a seconda del
								 * tipo di controllo
								 */
								 
								$sFlagIcon = fnGetResourceProperties($aRow[$sField], 'sIconFile', 'ESITO-CONTROLLO');
								if ($sField == "iEsitoVerifica") {
									if ($sFlagIcon == 'flag_red.png') $sFlagIcon = 'flag_yellow.png';
								} else if ($sField == "iEsitoSollecito") {
									if ($sFlagIcon == 'flag_red.png') $sFlagIcon = 'flag_orange.png';
								}
								
								$sValue = "<div class='center'>".(!empty($aRow[$sField]) ? "<img src='../themes/common/images/$sFlagIcon' border='0' />" : '')."</div>";
							}
							
							else if ($sField == "iDraggable") {
								
								/**
								 * Per visualizzare l'immagine 'draggable' la tabella deve avere un
								 * permesso di accesso con almeno il permesso 'modifica'
								 */
								 
								if (is_allowed('edit', fnFieldAccessLvl($iAccessLvl)))
									$sValue = "<img iView='".$aRow['id']."' class='draggable' src='../themes/common/images/shape_square.png' border='0' />";
								else
									$sValue = "&nbsp;";
							}
			
							else if (is_valid_email($aRow[$sField])) {
								$sValue = "<a class='viewLink' title='invia email a ".$aRow[$sField]."' href='mailto:".$aRow[$sField]."'>".
									(strlen($aRow[$sField]) > $iTABLE_STRING_MAX_LENGTH ? substr($aRow[$sField], 0, $iTABLE_STRING_MAX_LENGTH-4)."<font style='font-size:75%;'>&nbsp;...</font>" : $aRow[$sField]).
									"</a>";
							}
							
							else if (fnCheckFieldsDataType($sField, 'text')) {
								// rimuovo i tag HTML nel caso in cui il campo abbia un
								// testo formattato
								$sValue = strip_tags(br2space($sValue));
								$sValue = (strlen($sValue) > $iTABLE_STRING_MAX_LENGTH ? substr($sValue, 0, $iTABLE_STRING_MAX_LENGTH-4)."<font style='font-size:75%;'>&nbsp;...</font>" : $sValue);	
							}
							
							else  {	
								$sValue = (strlen($sValue) > $iTABLE_STRING_MAX_LENGTH ? substr($sValue, 0, $iTABLE_STRING_MAX_LENGTH-4)."<font style='font-size:75%;'>&nbsp;...</font>" : $sValue);
							}
			
							
							if (in_array($sField, $aWITH_TOOLTIP)) {
								if (!empty($sValue)) {
									$sValue = "<div class='tooltip' rel='tooltip.php?sField=$sField&sTable=$sTable&iView=".$aRow['id']."'>".$sValue."</div>";
								} else {
									$sValue = $sValue;	
								}
							}
							
							if (in_array($sField, $aWITH_LINK_TO_VIEW) && !is_valid_email($aRow[$sField]) && is_allowed('view', fnFieldAccessLvl($iAccessLvl, $sViewItemLink))) {
								
								/**
								 * se non è soddisfatto is_allowed('view', fnFieldAccessLvl($iAccessLvl, $sViewItemLink)),
								 * ovvero l'utente collegato non ha diritto a visualizzare la pagina
								 * $sViewItemLink, la tabella viene visualizzata senza i collegamenti
								 * alla pagina. Sono comunque possibili tutte le varie opzioni (drag
								 * and drop per i tag, toggable per le checkbox, etc. etc) a meno
								 * che la tabella non sia in sola visualizzazione (la tabella deve
								 * avere almeno il permesso 'modifica')
								 *
								 */
								 
								$sValue = "<a href=\"$sViewItemLink?iView=".$aRow['id']."\">$sValue</a>";
							
							}
							
							if (!is_numeric($sValue) || is_string($sValue)) {
								$sValue = "\"".preg_replace("/\"/", "\\\"", $sValue)."\", ";
							}  	
							
							$sOutput .= $sValue;			
						
						} // if (($aField['iTableShow'] == 1 || $aField['iExcelShow'] == 1) || $aField['sField'] == 'id')  {
						
					} // if (is_allowed('view', $iFieldAccessLvl)) {
				
				} // foreach ($aSettings as $sField)  {
				
				$sOutput = substr_replace($sOutput, '', -2);
				$sOutput .= "],";
		
			} // while ( $aRow = mysql_fetch_array( $rResult ) ) {
			
			$sOutput = substr_replace( $sOutput, "", -1 );
			$sOutput .= '] }';
		}
	
		else if ($_GET['sWhat'] == "summary-table") {
			
			$aSettings = fnDivSummary('aSettings', $sTable, $aTABLE[$sTable]['aSummaryTable']);

			if (isset($iDipartimento) && $iDipartimento!='') {
				$sQueryFields = " iUnita AS id, sUnita AS sDescrizione, ";
				$sGroupBy = $sSelect = "iUnita ";
				$sOrder = " ORDER BY sUnita ";
			
			} else {
				$sQueryFields = " iDipartimento AS id, sDipartimento AS sDescrizione, ";
				$sGroupBy = $sSelect = "iDipartimento ";
				$sOrder = " ORDER BY sDipartimento ";
			
			}
			
			$sQueryFields .= " SUM(sQuantita) AS sQuantita, SUM(dPreventivo) AS dPreventivo, SUM(dImporto) AS dImporto, SUM(dDifferenza) AS dDifferenza ";
				
			$sQuery = "
				SELECT SQL_CALC_FOUND_ROWS 
				$sQueryFields
				FROM $sTableSelectFrom
				WHERE $sWhere
				GROUP BY " . ($sTableSelectGroupBy != "" ? " $sTableSelectGroupBy, " : "") . " $sGroupBy
				$sOrder
			";
	
			$rResult = custom_mysql_query( $sQuery);
			
			$sQuery = "
				SELECT FOUND_ROWS()
			";
			$rResultFilterTotal = custom_mysql_query( $sQuery);
			$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
			$iFilteredTotal = $aResultFilterTotal[0];
			
			$sQuery = "
				SELECT COUNT(id)
				FROM $sTableSelectFrom WHERE $sTableSelectWhere
			";
			$rResultTotal = custom_mysql_query( $sQuery);
			$aResultTotal = mysql_fetch_array($rResultTotal);
			$iTotal = $aResultTotal[0];
			
			$sOutput = '{';
			$sOutput .= '"sEcho": '.intval($_GET['sEcho']).', ';
			$sOutput .= '"iTotalRecords": '.$iTotal.', ';
			$sOutput .= '"iTotalDisplayRecords": '.$iFilteredTotal.', ';
			$sOutput .= '"aaData": [ ';		
	
			while ( $aRow = mysql_fetch_array( $rResult ) ) {
				
				$sOutput .= "[";
				
				$i = 0; // la prima volta ($i == 0) che incontro un campo per cui fnCheckFieldsDataType($sField, 'currency')
						// lo formatto per la visualizzazione nella tabella, mentre la seconda volta  ($i != 0) scrivo il suo
						// valore senza formattazione per poter eseguire le somme con javascript ("fnFooterCallback" di DataTables)
				
				foreach ($aSettings as $sField)  {
					
					$sValue = preg_replace('/[\n\r]/','<br/>',$aRow[$sField]);
					
					// conversione formato numerico con separatore migliaia
					if (fnCheckFieldsDataType($sField, 'currency')) {
						if ($aRow[$sField] == "") {
							if ($i == 0) {
								$sValue = "";
								$i++;
							} else {
								$sValue = 0;
							}
						} else {
							if ($i == 0) {
								$sValue = number_format($sValue, ((round($sValue,2)) * 100 == (intval($sValue) * 100) ? 0 : 2), ',', '.');
									if (isset($aNegativeValueHighlight) && in_array($sField, $aNegativeValueHighlight)) {
										if ($sValue < 0) $sSpanClass = 'negative-value';
										else $sSpanClass = 'positive-value';
										$sValue = "<span class='$sSpanClass'>".$sValue."</span>";
									}
								$i++;
							} else {
								$sValue = "$sValue";
							}
						}
	
					} else {
						$sValue = "<div field='".trim($sSelect)."' value='".$aRow['id']."' class='summary-link'>$sValue</div>";
					} 
					
					$sOutput .= "\"".preg_replace("/\"/", "\\\"", $sValue)."\", ";
							
				}
				
				$sOutput = substr_replace($sOutput, '', -2);
				$sOutput .= "],";
			}
			
			$sOutput = substr_replace( $sOutput, "", -1 );
			$sOutput .= '] }';
		}
	
		echo $sOutput;	
		
		//
		///
		//// FINE DEL CODICE PER LA PAGINA 'json'
		///
		//
			
	}
	
	else if (fnScriptOutput ('excel', $sScript)) {
	
		//
		///
		//// INIZIO DEL CODICE PER LA PAGINA 'excel'
		///
		//
	

				
		$aParams = array();
		foreach ($_POST as $sName => $mValue) {
			if ($sName == 'aColumn')
				foreach ($mValue as $sColumn)
					$aParams[] = $sColumn;
		}
		
		if (count($aParams) < 1)  {
	
			$bSEARCH_FORM_SHOW = false;
			$sLEFT_NAV_IMG = 'x-office-spreadsheet.png';
			
			
			// RECUPERO DALLE PREFERENZE LA SELEZIONE DEI CAMPI DA ESPORTARE IN EXCEL
			$aSavedPrefs = array();
			$sQuery = "SELECT * FROM preferences WHERE sApp='$sAPP' AND sTable='$sTable' AND sField='excel' AND sUsername='".fnReadSessionValue('sUsername')."' GROUP BY sField";
			$rResult = custom_mysql_query($sQuery);
			if (mysql_num_rows($rResult) == 1)  {
				$aRow = mysql_fetch_assoc($rResult);
				$aSavedPrefs = explode("|", $aRow['sValue']);
			}
			
			
			
			// SELEZIONE DEI CAMPI DA ESPORTARE IN XLS
			$sHeaderTitle = $sAPP_NAME." &raquo; Selezione Campi da Esportare in Excel";
			$sTableTitle = $sTableDescription." &raquo; Esporta in Excel &raquo; Selezione Campi";

			$html .= "<div style='margin-top: 20px; margin-right: 250px;'>
				<form name='excel' id='excel' method='post' action='excel.php'>
				<input type='hidden' name='sTable' value='$sTable'>";
			
			$html .= "
				<div style='font-size:0.9em; font-weight:normal; font-color: #cecece; margin-bottom:8px;'>
					<strong>Selezione Campi:</strong>&nbsp;
					<span class='ui-link' sWhat='all'>Tutti</span>,&nbsp;
					<span class='ui-link' sWhat='none'>Nessuno</span>,&nbsp;
					<span class='ui-link' sWhat='toggle'>Inverti Selezione</span>
				</div>";
			
			foreach ($aSettings as $aColumn)  {
				$sField = ($aColumn['sAlias']=='' ? $aColumn['sField'] : $aColumn['sAlias']);
				$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, $sField);
				if ($aColumn['iExcelShow'] == 1 && (is_allowed('view', $iFieldAccessLvl)))  {
					$html .= "<input type='checkbox' ".
						(in_array($aColumn['id'], $aSavedPrefs) || empty($aSavedPrefs) ? 'checked' : '').
						" name='aColumn[]' value='".$aColumn['id']."'>&nbsp;".$aColumn['sLabel']."<br/>";		
				}
			}
			
			$html .= "	<div style='margin-top: 5px;'>
							<label for='aColumn[]' class='error' style='font-size:1.0em;'>Seleziona almeno un campo!</label>
						</div>
						<div style='clear:both'></div>";
				
			$html .= "<input type='submit' value='Esporta in Excel' style='margin-top: 25px;'>";	
			$html .= "</form>"; 
	
			/* ANNULLA */
			$html .= "<form method='get' action='index.php' style='margin-top: 6px;'>";
			$html .= 	fnHtmlBacklinkFull('input', '', $bSEARCH_FORM_SHOW, $bTagsShow);
			$html .= "	<input type='submit' value='Annulla'>";	
			$html .= "</form></div>"; 

			$sHeadContent .=  "
				
				<script type='text/javascript' src='../include/jquery.validate.min.js'></script>
				<script type='text/javascript' src='../include/jquery.cookie.js'></script>
	
				<script type='text/javascript' charset='utf-8'>
					
					$(document).ready(function(){
						
						$('.ui-link').click(function() { fnToggleCheckboxes($(this).attr('sWhat')); });	
						
						$('button, input:submit', 'form').button();
		
						$('#excel').validate({
							rules: {
								'aColumn[]': {
									required: true,
									minlength: 1
								}
							}
						});
					});
					
					function fnToggleCheckboxes(sWhat) {
						// written by Daniel P 3/21/07
						// toggle all checkboxes found on the page
						var oInputList = document.getElementsByTagName('input');
						for (i = 0; i < oInputList.length; i++) {
							if ( oInputList[i].getAttribute('type') == 'checkbox' ) {	// look only at input elements that are checkboxes
								if (sWhat=='toggle') {
									if (oInputList[i].checked)	oInputList[i].checked = false
									else						oInputList[i].checked = true;
								} else if (sWhat=='all') {
									oInputList[i].checked = true;
								} else if (sWhat=='none') {
									oInputList[i].checked = false;
								}
							}
						}
					}
				</script> ";

			require_once('../themes/'.$sTHEME.'/template.php');
			die();
		
		} else {

			// MEMORIZZO NELLE PREFERENZE LA SELEZIONE EFFETTUATA
			$sSavedPrefs = '';
			$sQuery = "SELECT * FROM preferences WHERE sApp='$sAPP' AND sTable='$sTable' AND sField='excel' AND sUsername='".fnReadSessionValue('sUsername')."' GROUP BY sField";
			$rResult = custom_mysql_query ($sQuery);
			if (mysql_num_rows($rResult) == 1)  {
				$sQuery = "DELETE FROM preferences WHERE sApp='$sAPP' AND sTable='$sTable' AND sField='excel' AND sUsername='".fnReadSessionValue('sUsername')."'";
				$rResult = custom_mysql_query ($sQuery);
			}
			foreach ($aParams as $sValue) {
				$sSavedPrefs = $sSavedPrefs."|".$sValue;
			}			
			$sQuery = "INSERT INTO preferences (sUsername, sApp, sTable, sField, sValue) VALUES ('".fnReadSessionValue('sUsername')."', '$sAPP', '$sTable', 'excel', '$sSavedPrefs')";
			$rResult = custom_mysql_query ($sQuery);
			
			
			
			
			$sFirstRow = $sTable; // $sFirstRow verrà scritta nella cella A1
			$sFilename = $sTable;
						
			// $aSelect
			foreach ($aSelect as $aFilter) {
				if (!empty($$aFilter['sField'])) {
					$sQuery = "SELECT ".$aFilter['sAlias']." FROM $sTableSelectFrom WHERE ".$aFilter['sField']."='".$$aFilter['sField']."' LIMIT 1";
					$rResult = custom_mysql_query($sQuery);
					if (mysql_num_rows($rResult) == 1) {
						$aRow = mysql_fetch_array($rResult);
						$sFirstRow .= "; ".$aRow[$aFilter['sField']];
						$sFilename = $sTable." ".$aRow[$aFilter['sField']];
					}			
				}
			}
	
			// $aRadiob
			if (sizeof($aRadiob)>0) {
				foreach ($aRadiob as $aButton)  {
					if (!empty($sShow) && $sShow == $aButton['sAlias'] && $aButton['sField'] != '1') { 
						$sFirstRow .= "; ". $aButton['sLabel'];
					}
				}
			}
			
			// SEARCHFORM
			if (isset($bSEARCH_FORM_SHOW) && $bSEARCH_FORM_SHOW) { 
				if (!empty($sSearchTerms)) {
					$sFirstRow .= "; risultato ricerca: $sSearchTerms";
				}	
			}	
			
			// TAGS
			if (isset($bTagsShow) && $bTagsShow) { 
				$aTagsData4Excel = fnTagsData4ExcelExport($sTable, $sAPP, true);
				$sFirstRow .= fnTagsFilter('sFirstRow', $sTag, $sTable, $sAPP);
			}

			/* Ordering */
			$sOrder = '';
			if (!is_null(fnReadSessionValue ('iSortCol_0', 'main-table', $sAPP, $sTable))) {
				$iSortingCols = fnReadSessionValue ('iSortingCols', 'main-table', $sAPP, $sTable);
				$sOrder = " ORDER BY ";
				for ( $i=0 ; $i<$iSortingCols ; $i++ ) {
					$sOrder .= fnColumnToField(fnReadSessionValue ('iSortCol_'.$i, 'main-table', $sAPP, $sTable), $aSettings )."
							 	".fnReadSessionValue ('sSortDir_'.$i, 'main-table', $sAPP, $sTable).", ";		
				}
				$sOrder = substr_replace( $sOrder, "", -2 )." ";
			}
				
			//
			$sQueryFields ='';
			foreach ($aSettings as $aColumn) {
				$sField = ($aColumn['sAlias']=='' ? $aColumn['sField'] : $aColumn['sAlias']);
				$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, $sField);
				if (is_allowed('view', $iFieldAccessLvl)) {
					if (($aColumn['iTableShow'] == 1 || $aColumn['iExcelShow'] == 1) || $aColumn['sField'] == 'id') {
						$sQueryFields .= " ".$aColumn['sField'].(!empty($aColumn['sAlias']) ? " AS ".$aColumn['sAlias'] : "").", ";
					}
				}
			}
			
			$sQueryFields =  substr($sQueryFields, 0, -2)." "; // substr perchè gli ultimi due caratteri della stringa sono  ", "
		
			$sQuery = "
				SELECT SQL_CALC_FOUND_ROWS 
				$sQueryFields
				FROM $sTableSelectFrom
				WHERE $sWhere ".
				($sTableSelectGroupBy != "" ? " GROUP BY $sTableSelectGroupBy " : "")."
				$sOrder
			";
	
			$rResult = custom_mysql_query($sQuery);
			
			// Creating a workbook
			$oWorkbook = new Spreadsheet_Excel_Writer();
		
			$oHeaderFormat =& $oWorkbook->addFormat();
			$oHeaderFormat->setBold();
			$oHeaderFormat->setColor('white');
			$oHeaderFormat->setPattern(1);
			$oHeaderFormat->setFgColor('blue');
			
			$oHeaderFormatTags =& $oWorkbook->addFormat();
			$oHeaderFormatTags->setBold();
			$oHeaderFormatTags->setColor('white');
			$oHeaderFormatTags->setPattern(1);
			$oHeaderFormatTags->setFgColor('green');
			
			$oFirstRowFormat =& $oWorkbook->addFormat();
			$oFirstRowFormat->setBold();
			
			// $sEuro = '#,##0'; // FIXME
			// $oMoneyFormat =& $oWorkbook->addFormat(); // FIXME
			// $oMoneyFormat->setNumFormat($sEuro); // FIXME
			
			// sending HTTP headers
			$oWorkbook->send($sFilename.'.xls');
			
			// Creating a worksheet
			$oWorksheet1 =& $oWorkbook->addWorksheet();
		
			// Nella cella A1 scrivo la descrizione dei filtri utilizzati per l'export
			$oWorksheet1->write(0, 0, utf8_decode($sFirstRow), $oFirstRowFormat);
			
			// Scrivo i titoli
			$iR = $iRTitle=1 ; $iC=0;
			foreach ($aSettings as $aField) {
				$sField = ($aField['sAlias']=='' ? $aField['sField'] : $aField['sAlias']);
					
					// 14/03/2011 in alcuni casi è necessario utilizzare gli apici ` nel nome del campo (ad esempio per 
					// `tsMailMANAGER-SIC`). Gli apici sono necessari solo per la query MySQL, per recuperare il dato 
					// dall'array $aRow occorre eliminare l'apice iniziale e quello finale 
					if (substr($sField, 0, 1)=='`' && substr($sField, -1, 1)=='`')
						$sField = substr($sField, 1, strlen($sField)-2);
						
				$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, $sField);
				if ($aField['iTableShow'] == 1 || $aField['iExcelShow'] == 1)  {
					if (in_array($aField['id'], $aParams) && $aField['iExcelShow'] == 1 && (is_allowed('view', $iFieldAccessLvl)))  {
						if ($sField == 'iShowTags') {
							if (isset($aTagsData4Excel[key($aTagsData4Excel)])) {
								foreach ($aTagsData4Excel[key($aTagsData4Excel)] as $sLabel => $sTag)  {
									if ($sLabel != 'id') {
										$oWorksheet1->write($iRTitle, $iC, utf8_decode($sLabel), $oHeaderFormatTags);
										$iC++;
									}
								}
							}

						} else {
							$oWorksheet1->write($iRTitle, $iC, utf8_decode($aField['sLabel']), $oHeaderFormat);
							$iC++;
						}
					}
				}
			}
			$iR++;
			
			// Scrivo il contenuto della tabella	
			while ($aRow = mysql_fetch_array($rResult)) {
				$iC=0;
				foreach ($aSettings as $aField)  {
					$sField = ($aField['sAlias']=='' ? $aField['sField'] : $aField['sAlias']);
						
						// 14/03/2011 in alcuni casi è necessario utilizzare gli apici ` nel nome del campo (ad esempio per 
						// `tsMailMANAGER-SIC`). Gli apici sono necessari solo per la query MySQL, per recuperare il dato 
						// dall'array $aRow occorre eliminare l'apice iniziale e quello finale 
						if (substr($sField, 0, 1)=='`' && substr($sField, -1, 1)=='`')
							$sField = substr($sField, 1, strlen($sField)-2);
						
					$iFieldAccessLvl = fnFieldAccessLvl($iAccessLvl, '', 0, $sField);
					if ($aField['iTableShow'] == 1 || $aField['iExcelShow'] == 1)  {
						if (in_array($aField['id'], $aParams) && $aField['iExcelShow'] == 1 && (is_allowed('view', $iFieldAccessLvl)))  {
							
							if (fnCheckFieldsDataType($sField, 'date')) {
								if ($aRow[$sField] == "0000-00-00") {
									$sValue = "";
								} else {
									$sValue = date_convert($aRow[$sField], 'html');
								}
								$oWorksheet1->write($iR, $iC, utf8_decode($sValue));
								$iC++;
							
							} else if (fnCheckFieldsDataType($sField, 'checkbox')) {
								$sValue = ($aRow[$sField] == 'X' || $aRow[$sField] == 1 ? 'X' : '');
								$oWorksheet1->write($iR, $iC, utf8_decode($sValue));
								$iC++;								

							} else if ($sField == 'iShowTags') {
								if (isset($aTagsData4Excel[$aRow['id']])) {
									foreach ($aTagsData4Excel[$aRow['id']] as $sLabel => $sTag)  {
										$sValue = ($sTag == 1 ? $sLabel : '');
										$oWorksheet1->write($iR, $iC, utf8_decode($sValue));
										$iC++;
									}
								}
										
							} else if ($sField == 'iShowTagsCompactColumns') {
								if (isset($aTagsData4Excel[$aRow['id']])) {
									foreach ($aTagsData4Excel[$aRow['id']] as $sLabel => $sTag)  {
										if ($sTag == 1)  {
											$oWorksheet1->write($iR, $iC, utf8_decode($sLabel));
											$iC++;
										}
									}
								}
																	
							} else {
								$sValue = $aRow[$sField]; 
									
									if (fnCheckFieldsDataType($sField, 'currency')) {
										 // FIXME
									
									} else if (fnCheckFieldsDataType($sField, 'text')) {
										// rimuovo i tag HTML nel caso in cui il campo abbia un
										// testo formattato
										$sValue = strip_tags($sValue);
									
									}
									
									$oWorksheet1->write($iR, $iC, utf8_decode($sValue));
									$iC++;
							}
							
						}
					}		
				}
				$iR++;
			}
			
			// Let's send the file
			$oWorkbook->close();
		
		}		
		
		//
		///
		//// FINE DEL CODICE PER LA PAGINA 'excel'
		///
		//
			
	}	
		
	
		
?>
